package com.cloudOffice.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;

/**
 * @program: cloud-office
 * @className: JwtUtils
 * @description: JWT帮助类
 * @data: 2024/2/8 17:35
 * @author: ihu
 * @version: 1.0
 **/

@Slf4j
public class JwtUtils {
	public static final Integer TOKEN_EXPIRATION_TIME = 24 * 60 * 60 * 1000;
	private static final String TOKEN_KEY = "cloud-office";
	
	
	/**
	 * 生成jwt
	 * 使用Hs256算法, 私匙使用固定秘钥
	 */
	public static String create(Map<String, Object> claims) {
		log.info("当前用户认证令牌：claims: {}", claims);
		// 指定签名的时候使用的签名算法，也就是header那部分
		SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512;
		// 生成JWT的时间
		Date exp = new Date(System.currentTimeMillis() + TOKEN_EXPIRATION_TIME);
		// 设置jwt的body
		return Jwts.builder()
				// 如果有私有声明，一定要先设置这个自己创建的私有的声明，这个是给builder的claim赋值，一旦写在标准的声明赋值之后，就是覆盖了那些标准的声明的
				.setClaims(claims)
				// 设置签名使用的签名算法和签名使用的秘钥
				.signWith(signatureAlgorithm, TOKEN_KEY.getBytes(StandardCharsets.UTF_8))
				// 设置过期时间
				.setExpiration(exp).compact();
	}
	
	/**
	 * Token解密
	 */
	public static Claims parse(String token) {
		// 得到DefaultJwtParser
		return Jwts.parser()
				// 设置签名的秘钥
				.setSigningKey(TOKEN_KEY.getBytes(StandardCharsets.UTF_8))
				// 设置需要解析的jwt
				.parseClaimsJws(token).getBody();
	}
}
